const { switchSector } = require('./score/switchSector');
/**
 * @description 计算连板天数
 * @param {Array} history 历史数据
 * @param {string} code 股票代码
 * @returns {number} 连板天数
 */
const calculateLimitUpDays = (history, code) => {
    let days = 0;
    // 确保有历史数据
    if (!history || history.length === 0) return days;

    // 判断股票所属板块
    const limitUpPercent =
        code.startsWith('688') || code.startsWith('300') || code.startsWith('301')
            ? 20
            : 10; // 科创板和创业板20%，主板10%

    for (let i = 0; i < history.length; i++) {
        // 计算当日涨幅
        const prevPrice =
            i < history.length - 1 ? history[i + 1] * 1 : history[i] * 1;
        const changePercent = ((history[i] * 1 - prevPrice) / prevPrice) * 100;
        // 判断是否涨停：
        const isNearLimit = changePercent >= limitUpPercent - 0.5; // 允许0.5%的误差

        if (isNearLimit) {
            days++;
        }
    }
    return days;
};

/**
 * @description 生成股票预测
 * @param {Array} stocks 股票列表
 */
const generatePredictions = async (stocks) => {
    return Promise.all(
        stocks.map(async (stock) => {
            const predictionScore = calculateScore(stock);
            return {
                ...stock,
                predictionScore
            };
        })
    );
};

/**
 * @description 计算综合预测得分
 */
const calculateScore = (stock) => {
    const {
        code, // 编码
        changePercent, // 当日涨跌幅
        volumeRatio, // 量比
        turnoverRate, // 换手率
        pe, // 市盈率（动）
        pb, // 市净率
        mainMoneyNet, // 主力资金净流入（元）
        threeDayChange, // 3日涨跌幅
        fiveDayChange, // 5日涨跌幅
        marketValue, // 流通市值
        sector, // 板块信息
        price, // 当前价格
        highPrice, // 近百日最高价
        lowPrice, // 近百日最低价
        roe,// 净资产收益率
        ratio// 资产负债率
    } = stock;
    let score = 0;

    // 主力资金强度（15分）
    if (mainMoneyNet >= 1e9) score += 8;
    else if (mainMoneyNet >= 5e8 && mainMoneyNet < 1e9) score += 15;
    else if (mainMoneyNet >= 2e8 && mainMoneyNet < 5e8) score += 13;
    else if (mainMoneyNet >= 1e8 && mainMoneyNet < 2e8) score += 12;
    else if (mainMoneyNet >= 5e7 && mainMoneyNet < 1e8) score += 10;
    else if (mainMoneyNet >= 1e7 && mainMoneyNet < 5e7) score += 5;
    else if (mainMoneyNet > 0 && mainMoneyNet < 1e7) score += 5;
    else if (mainMoneyNet > -5e7 && mainMoneyNet <= 0) score -= 5;
    else if (mainMoneyNet > -1e8 && mainMoneyNet < -5e7) score -= 10;
    else if (mainMoneyNet < -1e8) score -= 15;

    // 量比（15分）
    if (volumeRatio > 1) {
        if (volumeRatio > 3) score += changePercent > 0 ? 15 : -15;
        else if (volumeRatio > 2) score += changePercent > 0 ? 10 : -10;
        else score += changePercent > 0 ? 5 : -5;
    } else {
        score += changePercent < 0 ? 8 : -8;
    }

    // 板块（55分） 换手率（10分）市盈率（10分）市净率（10分）流通市值（5分）净资产收益率（10分）资产负债率（10分）
    score += switchSector({ turnoverRate, pe, pb, marketValue, sector, roe, ratio });

    // 三日涨跌幅（10分）
    // if (threeDayChange >= 20) score += 10;
    // else if (threeDayChange >= 10) score += 5;

    // 五日涨跌幅（5分）
    // if (fiveDayChange >= 30) score += 5;
    // else if (fiveDayChange >= 15) score += 3;

    // 涨幅分段（10分）
    const isChiNext =
        code.startsWith('688') || code.startsWith('300') || code.startsWith('301');
    if (isChiNext) {
        if (changePercent >= 4 && changePercent <= 8) score += 5;
        else if (changePercent > 8 && changePercent <= 12) score += 6;
        else if (changePercent > 12 && changePercent <= 16) score += 8;
        else if (changePercent > 16) score += 10;
        else if (changePercent > 0) score += 2;
    } else {
        if (changePercent >= 3 && changePercent <= 5) score += 5;
        else if (changePercent > 5 && changePercent <= 7) score += 6;
        else if (changePercent > 7 && changePercent <= 8) score += 8;
        else if (changePercent > 8) score += 10;
        else if (changePercent > 0) score += 2;
    }
    // const limit = isChiNext ? 19.5 : 9.5;
    // if (Math.abs(changePercent) >= limit) {
    //     score += changePercent > 0 ? 10 : -10;
    // }

    // 近百日最低价（10分）
    if (lowPrice && lowPrice.length === 3) {
        const [low, fifteenLow, thirtyLow] = lowPrice;
        if (price <= thirtyLow && price > fifteenLow) {
            score += 5;
        } else if (price <= fifteenLow && price > low) {
            score += 7;
        } else if (price <= low) {
            score += 10;
        }
    }
    // 共120分
    return score;
};

module.exports = { calculateLimitUpDays, calculateScore, generatePredictions };
